package com.example.exceldemo.util;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import org.springframework.core.io.ClassPathResource;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

public class WordUtil {

    /**
     * 生成 word 文档
     * @param wordTemplatePath    word 模板路径
     * @param targetWordFilePath  生成目标文档路径
     * @param data                待渲染的数据模型-哈希表形式
     */
    public static void generateWordFile(String wordTemplatePath, String targetWordFilePath, Map<String, Object> data) {
        XWPFTemplate template = XWPFTemplate.compile(wordTemplatePath).render(data);
        try {
            template.writeAndClose(new FileOutputStream(targetWordFilePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成 word 文档
     * @param wordTemplatePath    word 模板路径
     * @param targetWordFilePath  生成目标文档路径
     * @param data                待渲染的数据模型-Java对象形式
     */
    public static void generateWordFile(String wordTemplatePath, String targetWordFilePath, Object data) {
        XWPFTemplate template = XWPFTemplate.compile(wordTemplatePath).render(data);
        try {
            template.writeAndClose(new FileOutputStream(targetWordFilePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成 word 文档
     * @param wordTemplatePath    word 模板路径
     * @param targetWordFilePath  生成目标文档路径
     * @param data                待渲染的数据模型-哈希表形式
     * @param configure           渲染配置
     */
    public static void generateWordFile(String wordTemplatePath, String targetWordFilePath, Map<String, Object> data, Configure configure) {
        XWPFTemplate template = XWPFTemplate.compile(wordTemplatePath, configure).render(data);
        try {
            template.writeAndClose(new FileOutputStream(targetWordFilePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成 word 文档
     * @param wordTemplatePath    word 模板路径
     * @param targetWordFilePath  生成目标文档路径
     * @param data                待渲染的数据模型-Java对象形式
     * @param configure           渲染配置
     */
    public static void generateWordFile(String wordTemplatePath, String targetWordFilePath, Object data, Configure configure) {
        XWPFTemplate template = XWPFTemplate.compile(wordTemplatePath, configure).render(data);
        try {
            template.writeAndClose(new FileOutputStream(targetWordFilePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 统一使用类路径方式生成 word 文档
     * @param templatePath        模板文件名
     * @param targetWordFilePath  生成目标文档路径
     * @param data                待渲染的数据模型-Java对象形式
     * @param configure           渲染配置
     */
    public static void generateWordFileByOS(String provCode,String templatePath, String targetWordFilePath, Object data, Configure configure) {
        try {
            XWPFTemplate template;
            
            // 从类路径加载模板文件 - 修复路径处理以处理无效字符
            ClassPathResource resource = new ClassPathResource("template/"+ provCode.toLowerCase() + "/" + (templatePath.contains(File.separator) ?
                new File(templatePath).getName() : templatePath));
            if (!resource.exists()) {
                throw new IOException("模板文件不存在: template/" + templatePath);
            }
            
            try (InputStream inputStream = resource.getInputStream()) {
                template = XWPFTemplate.compile(inputStream, configure).render(data);
            }
            
            template.writeAndClose(new FileOutputStream(targetWordFilePath));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("生成Word文档失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * 统一使用类路径方式生成 word 文档
     * @param templatePath        模板文件名
     * @param targetWordFilePath  生成目标文档路径
     * @param data                待渲染的数据模型-Map形式
     * @param configure           渲染配置
     */
    public static void generateWordFileByOS(String templatePath, String targetWordFilePath, Map<String, Object> data, Configure configure) {
        try {
            XWPFTemplate template;
            
            // 从类路径加载模板文件 - 修复路径处理以处理无效字符
            ClassPathResource resource = new ClassPathResource("template/" + (templatePath.contains(File.separator) ? 
                new File(templatePath).getName() : templatePath));
            if (!resource.exists()) {
                throw new IOException("模板文件不存在: template/" + templatePath);
            }
            
            try (InputStream inputStream = resource.getInputStream()) {
                template = XWPFTemplate.compile(inputStream, configure).render(data);
            }
            
            template.writeAndClose(new FileOutputStream(targetWordFilePath));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("生成Word文档失败: " + e.getMessage(), e);
        }
    }
} 